/* ----------------------------------------------------------------------- */
/* Plantilla generada por Piklab */
#include "pic16f819IGL.h"
#include "delay16.h"
/**
 * @author Miguel Montiel Martínez
 * @brief Programa para el posicionamiento de los ejes del servomecanismo
 *  	  para la automatizacion en medición paleo-ambientl IGL - Tec Teziutlan
 * 	  a cargo del PhD Priyadarsi Debajyoti Roy
 * @verbatim	
 * 	  El programar devolverá un código dependiendo de la posición de los sensores
 * 	  en la máquina, esto de acuerdo a la tabla que a continuacion de muestra
 * 
 * 	  Los sensores son activos en nivel bajo
 * 
 * 	S4  S3  S2  S1  |  LS1  LS0 | Descripcion                  | Valor
 * 	-----------------------------+---------------------------------------------
 *      x   x   x   x   |   x     0  | Falla Interruptor de Limite | 0
 *      x   x   x   x   |   0     x  | Falla Interruptor de Limite | 0
 *   	0   0   0   0   |   1     1  | Falla sensores              | B
 *      0   0   0   1   	     | Falla sensores              | B
 *	0   0   1   0                | Falla sensores              | B
 *	0   0   1   1		     | Falla sensores              | B
 *      0   1   0   0		     | Falla sensores              | B
 * 	0   1   0   1		     | z abajo ultima              | A
 *	0   1   1   0		     | z abajo primera             | 4
 *	0   1   1   1   	     | z abajo                     | 6
 *	1   0   0   0		     | Falla sensores              | B
 *	1   0   0   1		     | z arriba ultima             | 8
 *	1   0   1   0		     | Home                        | 2
 * 	1   0   1   1		     | z arriba                    | 5
 *	1   1   0   0		     | Falla sensores              | B
 *	1   1   0   1		     | Transicion ultima           | 9
 *	1   1   1   0		     | Transicion primera          | 3
 *	1   1   1   1  		     | Transicion                  | 7
 * 
 *      La tarjeta cuenta con 6 leds que indicaran el estado de los sensores
 * 	
 * 	Componente	LED	Sensor Asociado		Estado
 * 	D2		LED0	S1			ON = Inactivo OFF= Activo
 * 	D1		LED1	S2			ON = Inactivo OFF= Activo
 * 	D5		LED2	S3			ON = Inactivo OFF= Activo
 * 	D6		LED3	S4			ON = Inactivo OFF= Activo
 * 	D3		LS1	LS1			ON = Inactivo OFF= Activo
 * 	D4		LS0	LS0			ON = Inactivo OFF= Activo
 * 
 * 	Las terminales asociadas del microcontrolador son las que a continuacion se
 * 	describen
 * 
 * 	Entradas			Salidas
 * 	S4  --- RA2			RB2  --- D0
 * 	S3  --- RA3			RB3  --- D1
 *      S2  --- RA4			RB4  --- D2
 * 	S1  --- RA5 (MCLR OFF)	 	RB5  --- D3
 * 	LS0 --- RB0			
 * 	LS1 --- RB1			RA1  --- LED0
 * 					RA0  --- LED1
 * 					RA7  --- LED2 (Osc interno)
 * 					RA6  --- LED3 (Osc interno)
 * 					RB7  --- LS0
 * 					RB6  --- LS1
 * 
 * @endverbatim
 */

/* ----------------------------------------------------------------------- */
/* Bits de configuración: adapte los parámetros a su necesidad */
typedef unsigned int word;
//word __at 0x2007 CONFIG = _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _DATA_CP_ON & _CP_ON;
word __at 0x2007 CONFIG = _WDT_OFF & _PWRTE_ON & _INTRC_IO & _MCLR_OFF & _BODEN_OFF & _LVP_OFF & _CPD_ON & _WRT_ENABLE_OFF & _DEBUG_OFF & _CCP1_RB2 & _CP_ALL;

/*Macros para definir terminales*/
#define	S4	RA2
#define S3	RA3
#define S2	RA4
#define S1 	RA5
#define LS0	RB0
#define LS1	RB1

#define D0	RB2
#define D1	RB3
#define D2	RB4
#define D3	RB5

#define LED0	RA1
#define LED1	RA0
#define LED2	RA7
#define LED3  	RA6
#define LEDLS0  RB7
#define LEDLS1  RB6

/*Prototipo de funcion para configurar entradas y salidas*/
void ConfigBoard(void);

void main() {
    /* << agregue el código >> */
    unsigned char temp=0x00;
    unsigned char code=0x0B; //inicia con un codigo de error
    unsigned char i=0;
    ConfigBoard();
    LED0=0;
    LED1=0;
    LED2=0;
    LED3=0;
    LEDLS0=0;
    LEDLS1=0;
    
          for(i=0;i<10;i++)
	    {
	      LED0=1;
	      LED1=1;
	      LED2=1;
	      LED3=1;
	      LEDLS0=1;
	      LEDLS1=1;
	      delay_ms(350);
	      LED0=0;
	      LED1=0;
	      LED2=0;
	      LED3=0;
	      LEDLS0=0;
	      LEDLS1=0;
	      delay_ms(350);
	    }
	    
    while(1){
     temp=0x00;
    if(!LS0) {temp&=0x2F; LEDLS0=1;}  //0b0001 0000
    else {temp|=0x10; LEDLS0=0;}  //0b0010 1111
    
    if(!LS1) {temp&=0x1F; LEDLS1=1;}  //0b0010 0000
    else {temp|=0x20; LEDLS1=0;}  //0b0001 1111
    
    
 
    if(!S4) {temp &=0x37; LED3=1;}  //0b0000 1000
    else {temp|=0x08; LED3=0;} //0b0011 0111
    
    if(!S3) {temp&=0x3B; LED2=1;} //0b0000 0100
    else {temp|=0x04; LED2=0;}  //0b0011 1011
    
    if(!S2) {temp&=0x3D; LED1=1;} //0b0000 0010
    else {temp|=0x02; LED1=0;}  //0b0011 1101
    
    if(!S1) {temp&=0x3E; LED0=1;} //0b0000 0001
    else {temp|=0x01; LED0=0;}  //0b0011 1110
    

 /* 
 * 	S4  S3  S2  S1  |  LS1  LS0 | Descripcion                  | Valor
 * 	-----------------------------+---------------------------------------------
 *      x   x   x   x   |   x     0  | Falla Interruptor de Limite | 0
 *      x   x   x   x   |   0     x  | Falla Interruptor de Limite | 0
 *   	0   0   0   0   |   1     1  | Falla sensores              | B
 *      0   0   0   1   	     | Falla sensores              | B
 *	0   0   1   0                | Falla sensores              | B
 *	0   0   1   1		     | Falla sensores              | B
 *      0   1   0   0		     | Falla sensores              | B
 * 	0   1   0   1		     | z abajo ultima              | A 35
 *	0   1   1   0		     | z abajo primera             | 4 36
 *	0   1   1   1   	     | z abajo                     | 6 37 
 *	1   0   0   0		     | Falla sensores              | B 38
 *	1   0   0   1		     | z arriba ultima             | 8 39
 *	1   0   1   0		     | Home                        | 2 3a
 * 	1   0   1   1		     | z arriba                    | 5 3b
 *	1   1   0   0		     | Falla sensores              | B 3c
 *	1   1   0   1		     | Transicion ultima           | 9 3d
 *	1   1   1   0		     | Transicion primera          | 3 3e
 *	1   1   1   1  		     | Transicion                  | 7 3f
 */
    temp&=0x3F;
    if(temp)
    switch(temp)
    {
      case 0x30: //0011 0000
	code = 0x0B;
	break;
      case 0x31:
	code = 0x0B;
	break;
      case 0x32:
	code = 0x0B;
	break;
      case 0x33:
	code = 0x0B;
	break;
      case 0x34:
	code = 0x0B;
	break;
      case 0x35:
	code = 0x0A;
	break;
      case 0x36:
	code = 0x04;
	break;
      case 0x37:
	code = 0x06;
	break;
      case 0x38:
	code = 0x0B;
	break;
      case 0x39:
	code = 0x08;
	break;
      case 0x3a:
	code = 0x02;
	break;
      case 0x3b:
	code = 0x05;
	break;
      case 0x3c:
	code = 0x0B;
	break;
      case 0x3d:
	code = 0x09;
	break;
      case 0x3e:
	code = 0x03;
	break;
      case 0x3f:
	code = 0x07;
	break;
      default:
	code = 0x00;
	break;
    }      
    temp = code;
    temp&=0x08;  //0b0000 1000
    temp = temp>>3;
    if(temp == 0x01){D3=1;}
    else{D3=0;}
    
    temp = code;
    temp&=0x04;
    temp=temp>>2;
    if(temp==0x01) {D2=1;}
    else{D2=0;}
    
    temp = code;
    temp&=0x02;
    temp=temp>>1;
    if(temp==0x01){D1=1;}
    else{D1=0;}
    
    temp = code;
    temp&=0x01;
    if(temp==0x01){D0=1;}
    else{D0=0;}

    }
}

void ConfigBoard(void)
{
  //CMCON = 0x07; pic16f628a
  
  //Seleccionando oscilador 4MHz
  IRCF2 = 1;
  IRCF1 = 1;
  IRCF0 = 0;
  ADCON1=0x06;
  TRISA0 = 0;
  TRISA1 = 0;
  TRISA2 = 1;
  TRISA3 = 1;
  TRISA4 = 1;
  TRISA5 = 1;
  TRISA6 = 0;
  TRISA7 = 0;
  
  TRISB0 = 1;
  TRISB1 = 1;
  TRISB2 = 0; 
  TRISB3 = 0;
  TRISB4 = 0;
  TRISB5 = 0;
  TRISB6 = 0;
  TRISB7 = 0;
}